377. 组合总和 Ⅳ

377. 组合总和 Ⅳ

Similar Question

Solution Tips

爬楼梯, 完全背包版本: 代码随想录

方案一: 完全背包问题 + 求排列方案数量

关键词就是调换两个 for 循环的顺序

但其本质是本题求的是排列总和,而且仅仅是求排列总和的个数,并不是把所有的排列都列出来。

如果本题要把排列都列出来的话,只能使用回溯算法爆搜

var combinationSum4 = function(nums, target) {
    // 完全背包问题 + 组合方式
    const n = nums.length;
    // 1. 在 总值为 j 时, 使用 [0-i] 面额的数字, 有多少种组合方式
    const dp = Array.from({ length: target + 1 }, () => 0);
    // 3. 在总值为 0 时, 不能选择任何数字, 只有 1 种方法
    dp[0] = 1;

    for (let j = 0; j <= target; j++) {
        for (let i = 0; i < n; i++) {
            // 2. 使用当前 num 后, 剩余的空间直接参考已有的方案总数为 dp[j - nums[i]]
            // 不使用当前硬币, 则方案数和之前的一样, 即: dp[j]
            if (j >= nums[i]) dp[j] += dp[j - nums[i]];
        }
        // console.log(dp.concat());
    }

    return dp[target];
};
let nums = [1,2,3], target = 4
console.log(combinationSum4(nums, target));